安卓开发教程翻译:创建妳自己的拼写检查器服务,Creating Your Own Spelling Checker Service
拼写检查器(Spelling Checker)框架提升了安卓上的文本输入体验:辅助用户快速地标识并且纠正拼写错误。当某个程序使用了拼写检查器框架时,用户会看到拼写错误或者未被识别的单词下面有一条红线,这样,用户就可以立即通过下拉菜单中的选项来纠正拼写错误。
如果妳是一名输入法编辑器(IME)开发人员,那么,拼写检查器框架使得妳能够为用户提供一种更好的使用体验。妳可以向妳的输入法中加入妳自己的拼写检查器,这样就可以依靠妳自己的字典来提供持久化的拼写错误纠正功能。妳的拼写检查器可以为那些对于妳的用户来说最重要的词汇进行识别并且提供纠正建议,而且,如果妳的语言还不被内置的拼写检查器支持的话,那么妳还可以为那种语言提供一个拼写检查器。
拼写检查器应用编程接口使得妳可以轻易地创建妳自己的拼写检查器服务。框架会管理好妳的拼写检查器服务与某个文本输入框之间的交互过程。在这篇勃客中,我们会从总体上告知妳该如何实现一个拼写检查器服务。欲知详情,请阅读拼写检查器框架应用编程接口指南(Spelling Checker Framework API Guide)。
1. 创建一个拼写检查器服务类
要想创建一个拼写检查器服务的话,第一步先要创建一个继承于android.service.textservice.SpellCheckerService的拼写检查器服务类。
如果妳想观摩一个拼写检查器示例的话,可参考SpellChecker 示例程序中的SampleSpellCheckerService 类,这个示例可在Android SDK 的Samples 下载包中找到。
2. 实现必要的方法
接下来,在妳的SpellCheckerService子类中,实现方法createSession()和onGetSuggestions(),如以下代码片断所示:
@Override
public Session createSession() {
return new AndroidSpellCheckerSession();
}
private static class AndroidSpellCheckerSession extends Session {
@Override
public SuggestionsInfo onGetSuggestions(TextInfo textInfo, int suggestionsLimit) {
SuggestionsInfo suggestionsInfo;
... // 查询针对textInfo( ☯ :原文是TextInfo)的拼写建议
return suggestionsInfo;
}
}
注意,onGetSuggestions(TextInfo, int)中的输入参数textInfo 包含着一个单独的单词。该方法以一个SuggestionsInfo对象的形式返回针对该单词的拼写建议。在这个方法的具体实现中,可以访问妳自己的自定义字典以及任何的辅助类,以便于提取拼写建议信息并且进行排序。
对于句子级别的拼写检查,妳可以实现onGetSuggestionsMultiple(),它接收的是一个TextInfo 数组。
3. 在AndroidManifest.xml中注册这个拼写检查器服务
除了实现妳的子类之外,妳还需要在清单文件中声明这个拼写检查器服务。在该声明中,会指定程序、服务以及一个元数据文件,该元数据文件定义了用于控制相关设置信息的活动(Activity)。以下是一个示例:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.samplespellcheckerservice">
<application android:label="@string/app_name">
<service
android:label="@string/app_name"
android:name=".SampleSpellCheckerService"
android:permission="android.permission.BIND_TEXT_SERVICE">
<intent-filter>
<action
android:name="android.service.textservice.SpellCheckerService" />
</intent-filter>
<meta-data
android:name="android.view.textservice.scs"
android:resource="@xml/spellchecker" />
</service>
</application>
</manifest>
注意,这个服务必须请求android.permission.BIND_TEXT_SERVICE这个权限,以确保只有系统会绑定到这个服务。
4. 创建一个元数据XML资源文件
最后,创建一个针对妳的拼写检查器的元数据文件,用来定义那个用于控制相关的拼写检查器设置信息的活动。该元数据文件还可以为该拼写检查器定义子类型(subtypes)。将该文件放置到妳在清单文件里声明该拼写检查器时所指定的位置。
在以下示例中,元数据文件spellchecker.xml将设置信息的活动指定为SpellCheckerSettingsActivity,并且包含了子类型,以定义该拼写检查器可以处理的区域语言。
<spell-checker xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/spellchecker_name"
android:settingsactivity="com.example.SpellCheckerSettingsActivity" />
<subtype
android:label="@string/subtype_generic"
android:subtypeLocale="en" />
</spell-checker>
成了!妳的拼写检查器已经完成了,可以被客户程序使用了,例如说妳的输入法。
加分点:加入针对多个句子的批处理功能
为了进行更快、更准确的拼写检查,Android 4.1 (Jelly Bean) 引入了一些应用编程接口,使得客户程序可以一次性向妳的拼写检查器传入多个句子。
要想支持在单次调用中对多个句子进行句子级别的检查的话,只需覆盖并实现onGetSentenceSuggestionsMultiple()方法就可以了,如下面例子所示。
private static class AndroidSpellCheckerSession extends Session {
@Override
public SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple(
TextInfo[] textInfo, int suggestionsLimit) {
SentenceSuggestionsInfo[] sentenceSuggestionsInfos;
... // 查询针对每个TextInfo的拼写建议
return sentenceSuggestionsInfos
}
}
在这种情况下,textInfo是一个TextInfo数组,其中每个元素都包含着一个句子。这个方法以一个SentenceSuggestionsInfo对象的形式返回针对每个句子的拼写建议的长度和偏移值。
文档及示例
如果妳想研究更多关于如何使用拼写检查器应用编程接口的信息的话,可参考以下文档及示例:
-
•. 拼写检查器框架应用编程接口指南—— 一份开发者指南,涵盖了拼写检查器应用编程接口的客户部分和服务部分。
-
•.SampleSpellCheckerService 示例程序—— 帮助妳开始实现自己的拼写检查器服务。
-
•.妳可以在下载的示例(Samples)中的/samples/android-15/SpellChecker/SampleSpellCheckerService里找到该程序。
-
-
•.HelloSpellChecker 示例程序—— 一个基本的应用到拼写检查器的程序。
-
•.妳可以在下载的示例中的/samples/android-15/SpellChecker/HelloSpellChecker里找到这个程序。
-
至于如何下载Android SDK 的示例程序,参考示例。
小泽玛丽亚
